package com.ruoyi.common.core.mybatisplus.core;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 自定义 Mapper 接口, 实现 自定义扩展
 *
 * @author Lion Li
 * @since 2021-05-13
 */
public interface BaseMapperPlus<T> extends BaseMapper<T> {

	/**
	 * 单sql批量插入( 全量填充 无视数据库默认值 )
	 * 适用于无脑插入
	 */
	int insertAll(@Param("list") Collection<T> batchList);


	/**
	 * 根据map参数查询数量
	 *
	 * @param params
	 * @return
	 */
	default long selectCountByMap(Map<String, Object> params) {
		QueryWrapper<T> qw = new QueryWrapper<>();
		params.entrySet().forEach((entry) -> {
			qw.eq(entry.getKey(), entry.getValue());
		});
		return this.selectCount(qw);
	}

	/**
	 * 根据一列值查询数量
	 * @param column
	 * @param value
	 * @return
	 */
	default long selectCountByColumn(String column, Object value) {
		QueryWrapper<T> qw = new QueryWrapper<T>();
		qw.eq(column, value);
		return this.selectCount(qw);
	}

	/**
	 * 通过一列值查询
	 *
	 * @param column
	 * @param value
	 * @return
	 */
	default List<T> selectListByColumn(String column, Object value) {
		Map<String, Object> columnMap = new HashMap<>();
		columnMap.put(column, value);
		return this.selectByMap(columnMap);
	}

	/**
	 * 根据QueryWrapper参数查询数量
	 * @param qw
	 * @return
	 */
	default List<T> selectListByQueryWrapper(QueryWrapper<T> qw) {
		return this.selectList(qw);
	}


	/**
	 * 根据QueryWrapper参数查询数量
	 * @param qw
	 * @return
	 */
	default long selectCountByQueryWrapper(QueryWrapper<T> qw) {
		return this.selectCount(qw);
	}
	/**
	 * 通过一列值查询
	 *
	 * @param column
	 * @param value
	 * @return
	 */
	default T selectOneByColumn(String column, Object value) {
		QueryWrapper<T> qw = new QueryWrapper<T>();
		qw.eq(column, value);
		return selectOne(qw);
	}

	default List<T> selectAllList(){
		return this.selectList(null);
	}
}
